/*
 * Bezier.cpp
 *
 *  Created on: 10/11/2009
 *      Author: leonardo
 */

#include "Bezier.h"
#include "Punto.h"
#include <GL/glut.h>
#include <string>
#include <math.h>
#include <cstdlib>

#define PUNTOS_RESOLUCION	1000
#define PUNTOS_CONTROL 	3
#define PADDING  100.0

Bezier::Bezier(){

}


Punto Bezier::calcularCoeficientes(float t)
{

	float ax,cx,bx;
	float ay,by,cy;
    /* cálculo de los coeficientes polinomiales */

    cx = 3.0 * (getPtsControl()[1].x() - getPtsControl()[0].x());
    bx = 3.0 * (getPtsControl()[2].x() - getPtsControl()[1].x()) - cx;
    ax = getPtsControl()[3].x() - getPtsControl()[0].x() - cx - bx;

    cy = 3.0 * (getPtsControl()[1].y() - getPtsControl()[0].y());
    by = 3.0 * (getPtsControl()[2].y() - getPtsControl()[1].y()) - cy;
    ay = getPtsControl()[3].y() - getPtsControl()[0].y() - cy - by;

    float tSquared = t * t;
    float tCubed = tSquared * t;
    Punto result;

    result.x( (ax * tCubed) + (bx * tSquared) + (cx * t) + getPtsControl()[0].x() );
    result.y( (ay * tCubed) + (by * tSquared) + (cy * t) + getPtsControl()[0].y() );

        return result;


}







void Bezier::dibujarCurva()
{


	  for ( int i=0; i<PUNTOS_RESOLUCION; i++ )
	  {
	    float t = (float)i/ (float)(PUNTOS_RESOLUCION - 1 );
	    agregarPuntoCurva(calcularCoeficientes(t));
	  }


}

/**
 * se pasan dos puntos y genera otros 3 aleatorios (5 en total)
 */
void Bezier::dibujarCurvaRandom(Punto inicio,Punto fin)
{
	int i = 0;
	float limite = 20.0;
	float coordX;
	float coordY;
	float coordZ = inicio.z();

	time_t t1;
	(void) time(&t1);
	srand48((long) t1);

	agregarPuntoControl(inicio);
	coordX = drand48() * limite;
	coordY = drand48() * limite;

	for ( i = 1 ; i < PUNTOS_CONTROL ; i++)
	{
		coordX = drand48() * limite;
		coordY = drand48() * limite;
		agregarPuntoControl(Punto(coordX,coordY,coordZ));
	}
	agregarPuntoControl(fin);
	dibujarCurva();
}

void Bezier::generarBezier(Punto inicio, Punto final)
{
	int i = 0;
	float limite = 20.0;
	float coordX;
	float coordY;
	float coordZ = inicio.z();
	Punto finalParcial;

	time_t t1;
	(void) time(&t1);
	srand48((long) t1);

	do
	{
		coordX = drand48() * limite;
		coordY = drand48() * limite;
		finalParcial = Punto(coordX,coordY,coordZ);
		dibujarCurvaRandom(inicio,finalParcial);
		inicio = finalParcial;
		i++;
	} while ( i < PUNTOS_CONTROL );
}

Bezier::~Bezier()
{ }
